package com.demo.cms.service;

import java.util.List;

import org.springframework.security.access.annotation.Secured;

import com.demo.cms.model.Article;
import com.demo.cms.service.exception.ArticleCreateException;
import com.demo.core.dao.base.support.ResultSearchResult;
import com.demo.core.dao.base.support.SearchArgumentSupport;

/**
 * 文章服务Service接口
 * 
 * @author ryuu.kk
 *
 */
public interface ArticleService {

	/**
	 * 排序：按照最新发布的顺序
	 */
	public static final String ORDER_BY_NEW = " PUBLISH_DATE ASC, ID ASC ";
	
	/**
	 * 排序：按照最新发布的顺序
	 */
	public static final String ORDER_BY_NEW_DESC = " PUBLISH_DATE DESC, ID DESC ";
	
	/**
	 * 排序：按照评论的多少排序
	 */
	public static final String ORDER_BY_COMMENT = " COMMENT_COUNT DESC, ID ASC ";
	
	/**
	 * 排序：通过置顶级别-发布时间-ID顺序进行排序
	 */
	public static final String ORDER_BY_TOP_LEVEL = " TOP_LEVEL ASC, PUBLISH_DATE ASC, ID ASC ";
	
	/**
	 * 创建文章
	 * @param article 文章模型
	 * @return 外键ID
	 */
	Long save(Article article) throws ArticleCreateException;;
	
	/**
	 * 文章是否存在
	 * @param id 外键ID
	 * @return 文章是否存在
	 */
	boolean exists(Long id);
	
	/**
	 * 删除一篇文章
	 * @param id 外键ID
	 */
	void delete(Long id);
	
	/**
	 * 更新文章模型信息
	 * 注意,如果其中包含文章内容和文章的扩展属性，将同时更新。
	 * @param id 文章外键ID
	 * @param article 文章模型(复合模型)
	 */
	void update(Long articleId, Article article);
	
	/**
	 * 更新FolderID信息
	 * @param articleId 文章ID
	 * @param folderId 文章文件夹ID
	 */
	void update(Long articleId, Long folderId);
	
	/**
	 * 查找文章模型对象
	 * <p>包含文章内容和扩展属性</p>
	 * @param id 外键ID
	 * @return 文章模型
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	Article find(Long id);
	
	/**
	 * 通过栏目ID查询文章模型列表
	 * <p>文章列表不包含文章内容和文章扩展属性</p>
	 * <ul>
	 * 	<li>文章将不包含草稿(IS_DRAFT)</li>
	 * 	<li>文章需要审核通过(IS_REJECT)</li>
	 * 	<li>文章可访问(ENABLED)</li>
	 * </ul>
	 * @param categoryId 栏目ID
	 * @param i18n 国际化CODE
	 * @return 文章模型列表
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	List<Article> findList(Long categoryId, String i18n);
	
	/**
	 * 通过栏目ID查询文章模型列表
	 * <p>文章列表不包含文章内容和文章扩展属性</p>
	 * @param categoryId 栏目ID
	 * @param i18n 国际化CODE
	 * @return 文章模型列表
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	List<Article> findList(Long categoryId, String i18n, boolean isDraft, boolean isReject, boolean enabled);

	/**
	 * 通过文章ID查新文章信息和所有内容
	 * 该方法为一个复合查询方法
	 * 文章模型中包含内容模型和扩展属性模型
	 * @param id 文章外键ID
	 * @return 文章模型对象
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	Article query(Long id);

	/**
	 * 通过文章ID查新文章信息和指定索引内容
	 * 该方法为一个复合查询方法
	 * 文章模型中包含内容模型和扩展属性模型
	 * @param id 文章外键ID
	 * @param index 文章内容索引
	 * @return 文章模型对象
	 */
	Article query(Long id, int index);

	/**
	 * 通过文章ID查新文章信息和指定索引内容
	 * 该方法为一个复合查询方法
	 * 文章模型中包含内容模型和扩展属性模型
	 * @param id 文章外键ID
	 * @param index 文章内容索引
	 * @param nameList 扩展属性名(为空则查询所有)
	 * @return 文章模型对象
	 */
	Article query(Long id, int index, List<String> nameList);
	
	/**
	 * 根据栏目ID和文章扩展属性Key查询文章列表
	 * <p>文章列表不包含文章内容和文章扩展属性</p>
	 * @param categoryId 栏目ID
	 * @param extendNames 扩展属性Name列表
	 * @param i18n 国际化CODE
	 * @return 文章模型列表
	 */
	//List<Article> findList(Long categoryId, String[] extendNames, String i18n);
	
	/**
	 * 通过栏目ID查询文章模型列表
	 * <p>文章列表不包含文章内容和文章扩展属性</p>
	 * @param categoryId 栏目ID
	 * @param extendName 扩展属性Name列表
	 * @param i18n 国际化CODE
	 * @return 文章模型列表
	 */
	//List<Article> findList(Long categoryId, String[] extendNames, String i18n, boolean isDraft, boolean isReject, boolean enabled);
	
	/**
	 * 通过栏目ID和国际化CODE分页查询文章
	 * 
	 * @param categoryId 文章栏目ID
	 * @param i18n 国际化CODE
	 * @param firstResult 第一条位置
	 * @param maxResults 总条数
	 * @return ResultSearchResult<Article>
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	ResultSearchResult<Article> search(Long categoryId, String i18n, SearchArgumentSupport args);
	
	/**
	 * 通过栏目ID和若干文章属性分页查询文章列表
	 * @param categoryId 栏目ID
	 * @param isComment 允许评论
	 * @param isDraft 是否草稿
	 * @param isCheck 是否需要审核
	 * @param isPermission 是否需要授权访问
	 * @param enabled 可用
	 * @param i18n 国际化CODE
	 * @param firstResult 数据起始位置
	 * @param maxResults 最大检索条数
	 * @return ResultSearchResult<Article> 
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	ResultSearchResult<Article> search(Long categoryId, 
										Boolean isComment, 
										Boolean isDraft, 
										Boolean isCheck, 
										Boolean isPermission, 
										Boolean enabled, 
										String i18n, SearchArgumentSupport args);
	/**
	 * 通过栏目ID和国际化CODE进行分页查询有效的文章信息
	 * 其中对检索的条数进行限制：0~limit
	 * @param categoryId 栏目ID
	 * @param i18n 国际化CODE
	 * @param orderBy 排序方式
	 * @param limit 检索条数
	 * @return ResultSearchResult<Article>
	 */
	ResultSearchResult<Article> searchActive(Long categoryId, String i18n, String orderBy, int limit);
	
	
	
	//~ 简单文章标题,图片信息查询====================================================================
	/**
	 * 查找文件模型
	 * 该对象只查找文章的ID,标题,短标题和缩略图信息.
	 * 
	 * @param categoryId 栏目ID
	 * @param args SearchArgumentSupport 分页/排序查询模型
	 * @return List<Article> 文章列表
	 */
	@Secured ({"ROLE_USER", "ROLE_ADMIN"})
	List<Article> simpleFindList(Long categoryId, SearchArgumentSupport args);
	
	/**
	 * 查找文件模型
	 * 该对象只查找文章的ID,标题,短标题和缩略图信息.
	 * @param id 文章ID
	 * @return Article 文章模型
	 */
	Article simpleFind(Long id);
	
	/**
	 * 通过栏目查看文章列表
	 * @param ssid 栏目ID
	 * @return List<Article> 文章列表
	 */
	List<Article> _findList(String ssid);
}
